package com.zn.task;

import com.alibaba.fastjson.JSONObject;
import com.zn.asycn.MdAsyncExecutor;
import com.zn.util.Constant;
import com.zn.vo.*;
import com.zn.web.rpc.MdRemoteCall;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author YinJiaWei
 * @version 2018/10/18 13:10
 */
@Component
public class ExecuteMdTask {
    private static final Logger LOGGER = LoggerFactory.getLogger(ExecuteMdTask.class);
    @Autowired
    private MdRemoteCall mdRemoteCall;
    @Autowired
    private RedisTemplate<String,String> redisTemplate;
    @Autowired
    private MdAsyncExecutor mdAsyncExecutor;

//    @Scheduled(cron="0 48 18 * * ?")   //每5秒执行一次
//     public void initTarget(){
//        try{
//            /** 查询标的证券信息，每天只需要查询一次**/
//            Response targetResponse=mdRemoteCall.target();
//            Object targets= JSONObject.toJSON(targetResponse.getTarget());
//            redisTemplate.opsForValue().set(Constant.TARGETS, targets.toString());
//            for (Target target:targetResponse.getTarget()){
//                /** 查询指定标的合约日期列表，每天只需要查询一次**/
//                Response dateResponse=mdRemoteCall.date(Integer.valueOf(target.getTg()));
//                /**将标的信息和标的对应的月份保存到mysql数据库中**/
//                mdAsyncExecutor.saveTgAndHyDate(target,dateResponse.getDate());
//                Object dates=JSONObject.toJSON(dateResponse.getDate());
//                redisTemplate.opsForValue().set(Constant.TARGETS_DATA + target.getTg(), dates.toString());
//                for(HyDate hyDate:dateResponse.getDate()){
//                    mdAsyncExecutor.executExecAndStat(target.getTg(),hyDate.getYm());
//                }
//            }
//        } catch (Exception e){
//            LOGGER.info("initTarget Error ..............:",e);
//        }
//    }
//    /**
//     * 根据标的获取第一个月的月份合约实时行情
//     */
////    @Scheduled(cron="*/1 * * * * ?")   //每1秒执行一次
//    public void getMdInfo1(){
//        try {
//            String targets=redisTemplate.opsForValue().get(Constant.TARGETS);
//            List<Target> jsonTarget=JSONObject.parseArray(targets, Target.class);
//            for(Target target:jsonTarget){
//                String targetDate=redisTemplate.opsForValue().get(Constant.TARGETS_DATA + target.getTg());
//                List<HyDate> hyDates=JSONObject.parseArray(targetDate, HyDate.class);
//                mdAsyncExecutor.getMdInfoBytargetAndDate(target.getTg(), hyDates.get(0).getYm());
//            }
//        }catch (Exception e){
//            LOGGER.info("getMdInfo1 Error ..............:", e);
//        }
//    }
//    /**
//     * 根据标的获取第二个月的月份合约实时行情
//     */
////    @Scheduled(cron="*/1 * * * * ?")   //每1秒执行一次
//    public void getMdInfo2(){
//        try {
//            String targets=redisTemplate.opsForValue().get(Constant.TARGETS);
//            List<Target> jsonTarget=JSONObject.parseArray(targets, Target.class);
//            for(Target target:jsonTarget){
//                String targetDate=redisTemplate.opsForValue().get(Constant.TARGETS_DATA + target.getTg());
//                List<HyDate> hyDates=JSONObject.parseArray(targetDate, HyDate.class);
//                mdAsyncExecutor.getMdInfoBytargetAndDate(target.getTg(), hyDates.get(1).getYm());
//            }
//        }catch (Exception e){
//            LOGGER.info("getMdInfo2 Error ..............:", e);
//        }
//    }
//    /**
//     * 根据标的获取第三个月的月份合约实时行情
//     */
////    @Scheduled(cron="*/1 * * * * ?")   //每1秒执行一次
//    public void getMdInfo3(){
//        try {
//            String targets=redisTemplate.opsForValue().get(Constant.TARGETS);
//            List<Target> jsonTarget=JSONObject.parseArray(targets, Target.class);
//            for(Target target:jsonTarget){
//                String targetDate=redisTemplate.opsForValue().get(Constant.TARGETS_DATA + target.getTg());
//                List<HyDate> hyDates=JSONObject.parseArray(targetDate, HyDate.class);
//                mdAsyncExecutor.getMdInfoBytargetAndDate(target.getTg(), hyDates.get(2).getYm());
//            }
//        }catch (Exception e){
//            LOGGER.info("getMdInfo3 Error ..............:", e);
//        }
//    }
//    /**
//     * 根据标的获取第四个月的月份合约实时行情
//     */
////    @Scheduled(cron="*/1 * * * * ?")   //每1秒执行一次
//    public void getMdInfo4(){
//        try {
//            String targets=redisTemplate.opsForValue().get(Constant.TARGETS);
//            List<Target> jsonTarget=JSONObject.parseArray(targets, Target.class);
//            for(Target target:jsonTarget){
//                String targetDate=redisTemplate.opsForValue().get(Constant.TARGETS_DATA + target.getTg());
//                List<HyDate> hyDates=JSONObject.parseArray(targetDate, HyDate.class);
//                mdAsyncExecutor.getMdInfoBytargetAndDate(target.getTg(), hyDates.get(3).getYm());
//            }
//        }catch (Exception e){
//            LOGGER.info("getMdInfo4 Error ..............:", e);
//        }
//    }
//    /**
//     * 根据标的获取所有合约实时行情
//     */
////    @Scheduled(cron="*/1 * * * * ?")   //每1秒执行一次
//    public void getMdInfo5(){
//        try {
//            String targets=redisTemplate.opsForValue().get(Constant.TARGETS);
//            List<Target> jsonTarget=JSONObject.parseArray(targets, Target.class);
//            for(Target target:jsonTarget){
//                mdAsyncExecutor.getMdInfoBytargetAll(target.getTg());
//            }
//        }catch (Exception e){
//            LOGGER.info("getMdInfo5 Error ..............:", e);
//        }
//    }
//
//    /**
//     * 爬取新浪etf数据
//     */
////    @Scheduled(cron="*/1 * * * * ?")   //每1秒执行一次
//    public void getEtfMdInfo(){
//        try {
//            mdAsyncExecutor.getEtfMdInfo();
//        }catch (Exception e){
//            LOGGER.info("getEtfMdInfo Error ..............:", e);
//        }
//    }
    /**
     * 爬取50etf期权合约买二~买五的数据
     */
    @Scheduled(cron="*/1 * * * * ?")   //每1秒执行一次
    public void getSinaMdInfo1(){
        try {
            mdAsyncExecutor.getSinaMdInfo();
        }catch (Exception e){
            LOGGER.info("getEtfMdInfo Error ..............:", e);
        }
    }


}
